/**
 *	5.如果A是个x行y列的矩阵，B是个y行z列的矩阵，把A和B相乘，其结果将是另一个x行z列的矩阵C。
 *	这个矩阵的每个元素是由下面的公式决定的：
 *	C(i,j) = (k = 1 到 y)A(i,k) + B(k,j)
 *	例如:
 *	{{2, -6}, {3, 5}, {1, -1}} * {{4, -2, -4, -5}, {-7, -3, 6, 7}} = 
 *	{{50, 14, -44, -52}, {-23, -21, 18, 20}, {11, 1, -10, -12}}
 *	结果矩阵中14这个值是通过2×-2加上-6×-3得到的。
 *	编写一个函数，用于执行两个矩阵的乘法。函数的原型如下：
 *	void matrix_multiply(int *m1, int *m2, int *r, int x, int y, int z);
 *	m1是一个x行y列的矩阵，m2是一个y行z列的矩阵，这两个矩阵应该相乘，结果存储于r中，它是一个x行z列的矩阵。
 *	记住，你应该对公式做些修改，以适应C语言下标从0而不是从1开始这个事实！
**/

#include <stdio.h>

void matrix_multiply(int *m1, int *m2, int *r, int x, int y, int z);

void main()
{
	int m1[3][2] = {{2, -6}, {3, 5}, {1, -1}};
	int m2[2][4] = {{4, -2, -4, -5}, {-7, -3, 6, 7}};
	int r[3][4] = {0};
	
	matrix_multiply((int *)m1, (int *)m2, (int *)r, 3, 2, 4);
	
	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 4; j++)
			printf("%d ", r[i][j]);
		printf("\n");
	}
}

void matrix_multiply(int *m1, int *m2, int *r, int x, int y, int z)
{
	for(int i = 0; i < x; i++)
	{
		for(int j = 0; j < z; j++)
		{
			int *pm1 = m1 + i * y;
			int *pm2 = m2 + j;
			for(int k = 0; k < y; k++)
			{
				*r += *pm1 * *pm2;
				pm1++;
				pm2 += z; 
			}
			r++;
		}
	}
}

/**
 *	注意到m1m2是个二维数组，而函数中只使用了一个整型指针（差点以为题目出错了），标准答案中解释是用圧扁数组的方法，
 *	建议不使用这种方法，原因是请看警告：
 *
 *	expected ‘int *’ but argument is of type ‘int (*)[4]’
 *	void matrix_multiply(int *m1, int *m2, int *r,...
 *
 *	还是好好的使用int (*)[4] 或者int m1[][4]吧
**/
